<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/8/19
 * Time: 16:51
 */
class 压缩文件帮助类
{

}

/*
File name: /include/zip.php
Author: Horace 2009/04/15
*/
class PHPZip{
    var $dirInfo = array("0","0");
    var $rootDir = '';
    var $datasec = array();
    var $ctrl_dir = array();
    var $eof_ctrl_dir = "/x50/x4b/x05/x06/x00/x00/x00/x00";
    var $old_offset = 0;
    function downloadZip(){
       // createZip($dir, $zipfilename, true);
    }
    function createZip($dir, $zipfilename, $autoDownload = false){
        if (@function_exists('gzcompress')){
            @set_time_limit("0");
            if (is_array($dir)){
                $fd = fopen ($dir, "r");

                $fileValue = fread ($fd, filesize ($filename));
                fclose ($fd);
                if (is_array($dir)) $filename = basename($dir);
                $this -> addFile($fileValue, "$filename");
            }else{
                $this->dirTree($dir,$dir);
            }
            $zipfilenametemp = time().$zipfilename;
            $out = $this -> filezip();
            $fp = fopen($zipfilenametemp, "w");
            fwrite($fp, $out, strlen($out));
            fclose($fp);
            $filesize = filesize($zipfilenametemp);
            if ($filesize < 104857600) {
                if($autoDownload){
                    header("Content-type: application/octet-stream");
                    header("Content-disposition: attachment; filename=".$zipfilename);
                }
                echo $this -> filezip();
            }else{
                echo "create zip error!";
            }
            unlink($zipfilenametemp);
        }
    }
    //get dir tree..
    function dirTree($directory,$rootDir){
        global $_SERVER,$dirInfo,$rootDir;
        $fileDir=$rootDir;
        $myDir=dir($directory);
        while($file=$myDir->read()){


            if(is_dir("$directory/$file") and $file!="." and $file!=".."){
                $dirInfo[0]++;
                $rootDir ="$fileDir$file/";
                $this -> addFile('', "$rootDir");
                //go on n's folders
                $this->dirTree("$directory/$file",$rootDir);
            }else{
                if($file!="." and $file!=".."){
                    $dirInfo[1]++;
                    //$fd = fopen ("$directory/$file", "r");
                    $fileValue = file_get_contents("$directory/$file");
                    //fclose ($fd);
                    $this -> addFile($fileValue, "$fileDir$file");
                }
            }
        }
        $myDir->close();
    }
    function unix2DosTime($unixtime = 0) {
        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
        if ($timearray['year'] < 1980) {
            $timearray['year'] = 1980;
            $timearray['mon'] = 1;
            $timearray['mday'] = 1;
            $timearray['hours'] = 0;
            $timearray['minutes'] = 0;
            $timearray['seconds'] = 0;


        } // end if
        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
            ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    }
    function addFile($data, $name, $time = 0){
        $name = str_replace('//', '/', $name);
        $dtime = dechex($this->unix2DosTime($time));
        $hexdtime = '/x' . $dtime[6] . $dtime[7]
            . '/x' . $dtime[4] . $dtime[5]
            . '/x' . $dtime[2] . $dtime[3]
            . '/x' . $dtime[0] . $dtime[1];
        eval('$hexdtime = "' . $hexdtime . '";');
        $fr = "/x50/x4b/x03/x04";
        $fr .= "/x14/x00"; // ver needed to extract
        $fr .= "/x00/x00"; // gen purpose bit flag
        $fr .= "/x08/x00"; // compression method
        $fr .= $hexdtime; // last mod time and date
        // "local file header" segment
        $unc_len = strlen($data);
        $crc = crc32($data);
        $zdata = gzcompress($data);


        $c_len = strlen($zdata);
        $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
        $fr .= pack('V', $crc); // crc32
        $fr .= pack('V', $c_len); // compressed filesize
        $fr .= pack('V', $unc_len); // uncompressed filesize
        $fr .= pack('v', strlen($name)); // length of filename
        $fr .= pack('v', 0); // extra field length
        $fr .= $name;
        // "file data" segment
        $fr .= $zdata;
        // "data descriptor" segment (optional but necessary if archive is not
        // served as file)
        $fr .= pack('V', $crc); // crc32
        $fr .= pack('V', $c_len); // compressed filesize
        $fr .= pack('V', $unc_len); // uncompressed filesize
        // add this entry to array
        $this -> datasec[] = $fr;
        $new_offset = strlen(implode('', $this->datasec));
        // now add to central directory record
        $cdrec = "/x50/x4b/x01/x02";
        $cdrec .= "/x00/x00"; // version made by
        $cdrec .= "/x14/x00"; // version needed to extract


        $cdrec .= "/x00/x00"; // gen purpose bit flag
        $cdrec .= "/x08/x00"; // compression method
        $cdrec .= $hexdtime; // last mod time & date
        $cdrec .= pack('V', $crc); // crc32
        $cdrec .= pack('V', $c_len); // compressed filesize
        $cdrec .= pack('V', $unc_len); // uncompressed filesize
        $cdrec .= pack('v', strlen($name) ); // length of filename
        $cdrec .= pack('v', 0 ); // extra field length
        $cdrec .= pack('v', 0 ); // file comment length
        $cdrec .= pack('v', 0 ); // disk number start
        $cdrec .= pack('v', 0 ); // internal file attributes
        $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set
        $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
        $this -> old_offset = $new_offset;
        $cdrec .= $name;
        // optional extra field, file comment goes here
        // save to central directory
        $this -> ctrl_dir[] = $cdrec;
    }
    function filezip(){
        $data = implode('', $this -> datasec);
        $ctrldir = implode('', $this -> ctrl_dir);
        return
            $data .
            $ctrldir .
            $this -> eof_ctrl_dir .
            pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
            pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
            pack('V', strlen($ctrldir)) . // size of central dir
            pack('V', strlen($data)) . // offset to start of central dir
            "/x00/x00"; // .zip file comment length
    }
}
?>



    还有另外一个比较简单的

    [php] view plaincopy

<?php

class createzip
{
    /*  @creates a compressed zip file  将多个文件压缩成一个zip文件的函数
     *   @$files 数组类型  实例array("1.jpg","2.jpg");
     *   @destination  目标文件的路径  如"c:/androidyue.zip"
     *   @$overwrite 是否为覆盖与目标文件相同的文件
     *   @Recorded By Androidyue
     *   @Blog:http://thinkblog.sinaapp.com
     */
    function create_zip($files = array(),$destination = '',$overwrite = false)
    {
        //如果zip文件已经存在并且设置为不重写返回false
        if(file_exists($destination) && !$overwrite) { return false; }
        $valid_files = array();
        //if files were passed in...
        //获取到真实有效的文件名
        if(is_array($files)) {
            //cycle through each file
            foreach($files as $file) {
                //make sure the file exists
                if(file_exists($file)) {
                    $valid_files[] = $file;
                }
            }
        }
        //如果存在真实有效的文件
        if(count($valid_files))
        {
            //create the archive
            $zip = new ZipArchive();
            //打开文件       如果文件已经存在则覆盖，如果没有则创建
            if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
                return false;
            }
            //向压缩文件中添加文件
            foreach($valid_files as $file) {
                $zip->addFile($file,$file);
            }
            //关闭文件
            $zip->close();
            //检测文件是否存在
            return file_exists($destination);
        }
        else{
            //如果没有真实有效的文件返回false
            return false;
        }
    }

}
/****
//测试函数
$files=array('temp.php','test.php');
create_zip($files, 'myzipfile.zip', true);
 ****/
?>